﻿// 1819. 序列中不同最大公约数的数目.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>


using namespace std;

/*
https://leetcode.cn/problems/number-of-different-subsequences-gcds/description/
给你一个由正整数组成的数组 nums 。

数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。

例如，序列 [4,6,16] 的最大公约数是 2 。
数组的一个 子序列 本质是一个序列，可以通过删除数组中的某些元素（或者不删除）得到。

例如，[2,5,10] 是 [1,2,1,2,4,1,5,10] 的一个子序列。
计算并返回 nums 的所有 非空 子序列中 不同 最大公约数的 数目 。


示例 1：
输入：nums = [6,10,3]
输出：5
解释：上图显示了所有的非空子序列与各自的最大公约数。
不同的最大公约数为 6 、10 、3 、2 和 1 。

示例 2：
输入：nums = [5,15,40,5,6]
输出：7

提示：
1 <= nums.length <= 105
1 <= nums[i] <= 2 * 105
*/

class Solution {
public:
    int gcd(int a, int b) {
        if (b == 0) return a;
        return gcd(b, a % b);
    }

    int countDifferentSubsequenceGCDs(vector<int>& nums) {
        int maxV = -1;
        //unordered_map<int, int> mm; 
        char mm[200010]; memset(mm, 0, sizeof mm);
        for (int i = 0; i < nums.size(); i++) { maxV = max(maxV, nums[i]); mm[nums[i]]++; }
        int ans = 0;
        for (int i = 1; i <= maxV; i++) {
            int g = 0;
            for (int j = i; j <= maxV; j += i) {
                if (mm[j] > 0 ) {
                    g = gcd(g, j);
                }
            }
            if (g == i) {
                ans++;
            }
        }

        return ans;
    }
};

int main()
{
    Solution s;
    vector<int>  v{ 6,10,3 };
    s.countDifferentSubsequenceGCDs(v);
    return 0;
}

 